package org.deng.learn.designpattern.state;

/**
 * @author DengLibin
 * @Description 状态模式(State)，行为型模式。状态模式通过将类按状态这个维度进行拆分，分离各个不同状态的逻辑。
 * 当一个对象具有很多不同的状态且不同状态下对操作的响应不同，或者说执行某操作的判断情况的条件分支相关代码过于复杂时，
 * 状态模式会是对象组合方式解决这一问题的非常好的方案
 */
public class Main {


    /**
     * 角色以及职责
     * Context： 上下文。应用策略模式的组件的主要的类。组件的功能的主要过程定义在这个类中。
     * State： 状态的抽象。在状态模式中，不同的状态不同的行为是Context通过将操作委托给State来实现的。
     *  所谓State就是实际执行操作的对象，在策略模式中给这个实际执行操作的对象取了个名称叫状态。
     * Concrete State： 具体状态。 State 的实现。
     *
     * 通过委托的方式，将 --------->操作的实际执行“下放”到状态的实现类中<-------，这样可以实现多个状态的动态切换，也可以扩展新的状态出来。通过这种手段，
     * 状态模式达成了一个目的，拆分不同状态的逻辑
     *
     * 状态模式（State） 和 策略模式(Strategy) 的不同点在于状态本身是否上下文相关。策略模式(Strategy) 的策略其实是独立的过程，在策略的实现中并不会访问Context自身。
     * 而状态模式（State） 的State是可能会访问到Context自身的。Strategy 可以被独立的用在其他的地方，而State和Context自身耦合度比较高，基本无法拿出来独立用到其他地方。
     *
     */

    public  static  void main(String[] args){
        MsgClient msgClient = new MsgClient(new OfflineState(),"邓力宾");
        msgClient.showChatForm();
        msgClient.sendMsg("你好","李四");

        msgClient.setClientState(new OnlineState(msgClient));
        msgClient.showChatForm();
        msgClient.sendMsg("你好","李四");

        msgClient.setClientState(new LockState());
        msgClient.showChatForm();
        msgClient.sendMsg("你好","李四");
    }


}
